package utils

// SliceFilter 过滤函数
// 该函数会对数组的每一个元素执行filterFun，若filterFun返回true则将该元素添加至新数组
func SliceFilter[T any](list []T, filterFun func(T) (bool, error)) (result []T, err error) {
	var ok bool
	for _, item := range list {
		ok, err = filterFun(item)
		if err != nil {
			return
		}
		if ok {
			result = append(result, item)
		}
	}
	return
}

// SliceReduce 聚合函数
// 该函数会对数组的每一个元素执行reduceFun，然后获取将结果聚合
func SliceReduce[T any, M any](list []T, reduceFun func(M, T) (M, error), initValue M) (result M, err error) {
	result = initValue
	for _, item := range list {
		result, err = reduceFun(result, item)
		if err != nil {
			return
		}
	}
	return
}

// SliceMap 映射函数
// 该函数会对数组的每一个元素执行mapFun，然后生成新的数组
func SliceMap[T any, R any](list []T, mapFun func(T) (R, error)) (result []R, err error) {
	result = make([]R, len(list))
	for index, item := range list {
		result[index], err = mapFun(item)
		if err != nil {
			return
		}
	}
	return
}
